package com.ihy.controller;


import com.ihy.domain.User;
import com.ihy.entity.Subscribe;
import com.ihy.service.ServiceSubscribe;
import com.ihy.service.ServiceUser;
import com.ihy.vo.ResultResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * 订阅功能前端处理程序
 * <p>
 * RestController注解：
 * 相当于@ResponseBody ＋ @Controller合在一起的作用。
 * <p>
 * ResponseBody注解:
 * 将controller的方法返回的对象通过适当的转换器转换为指定的格式之后，写入到response对象的body区，通常用来返回JSON数据或者是XML数据。
 * 注意：在使用此注解之后不会再走视图处理器，而是直接将数据写入到输入流中，他的效果等同于通过response对象输出指定格式的数据。
 * <p>
 * Controller注解:
 * 用于标记在一个类上，使用它标记的类就是一个SpringMVC Controller 对象。分发处理器将会扫描使用了该注解的类的方法，并检测该方法是否使用了@RequestMapping注解。
 * Controller注解只是定义了一个控制器类，而使用@RequestMapping 注解的方法才是真正处理请求的处理器。
 * <p>
 * CrossOrigin注解：
 * 出于安全原因，浏览器禁止Ajax调用驻留在当前原点之外的资源。例如，当你在一个标签中检查你的银行账户时，你可以在另一个选项卡上拥有EVILL网站。
 * 来自EVILL的脚本不能够对你的银行API做出Ajax请求（从你的帐户中取出钱！）使用您的凭据。
 * 跨源资源共享（CORS）是由大多数浏览器实现的W3C规范，允许您灵活地指定什么样的跨域请求被授权，而不是使用一些不太安全和不太强大的策略，如IFRAME或JSONP。
 * <p>
 * RequestMapping注解：
 * 是一个用来处理请求地址映射的注解，可用于类或方法上。用于类上，表示类中的所有响应请求的方法都是以该地址作为父路径。
 * <p>
 * Autowired注解:
 * 将构造函数、字段、setter方法或config方法标记为由Spring的依赖注入工具自动连接。
 * Autowired注解是按照类型（byType）装配依赖对象，默认情况下它要求依赖对象必须存在，如果允许null值，可以设置它的required属性为false。
 * 如果我们想使用按照名称（byName）来装配，可以结合@Qualifier注解一起使用。(通过类型匹配找到多个candidate,在没有@Qualifier、@Primary注解的情况下，会使用对象名作为最后的fallback匹配)
 **/
@RestController
//处理跨域请求
@CrossOrigin
@RequestMapping("Subscribe")
public class SubscribeController {
    @Autowired
    private ResultResponse resultResponse;

    private ServiceSubscribe serviceSubscribe;
    @Autowired
    private User user;
    @Autowired
    private ServiceUser serviceUser;

    @Autowired
    public void setServiceSubscribe(ServiceSubscribe subscribe) {
        this.serviceSubscribe = subscribe;
    }

    /**
     * 订阅邮箱
     *
     * @param subscribe 订阅表对象
     * @return 前端信息
     */
    @RequestMapping("subscribeEmail")
    public ResultResponse subscribeEmail(Subscribe subscribe) {
        //获取Authentication
        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
        //获取Principal
        UserDetails userDetails = (UserDetails) authentication.getPrincipal();
        //查询数据库 当前登录的用户
        user.setUsername(userDetails.getUsername());
        User query = serviceUser.query(user);
        //设置订阅的用户标识
        subscribe.setUserId(query.getId());
        //订阅邮箱操作
        int state = serviceSubscribe.insert(subscribe);
        //添加状态
        resultResponse.setCode(state);
        resultResponse.setMessage("订阅成功");
        resultResponse.setData(null);
        //返回信息
        return resultResponse;
    }
}
